#ifndef __UTILS_H
#define __UTILS_H

#include "cli_config.h"

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <time.h>
#include <unistd.h>

#define ARR_LEN(arr) (sizeof(arr) / sizeof((arr)[0])) ///< 求数组长度

#define MALLOC(type, count) ((type *)malloc(sizeof(type) * (count)))             ///< malloc宏函数
#define CALLOC(type, count) ((type *)calloc(count, sizeof(type)))                ///< calloc宏函数
#define REALLOC(ptr, type, count) ((type *)realloc(ptr, sizeof(type) * (count))) ///< realloc宏函数

/**
 * @brief 打印信息到终端，末尾自动加换行
 *
 */
#define PRINT_INFO(fmt, ...) fprintf(stderr, "\033[1m\033[36m[INFO]\033[0m " fmt "\n", ##__VA_ARGS__)

#ifdef DEBUG
/**
 * @brief 打印函数名及DEBUG信息到终端，末尾自动加换行
 *
 */
#define PRINT_DEBUG(fmt, ...) fprintf(stderr, "\033[1m\033[38;5;208m[DEBUG]\033[0m %s(): " fmt "\n", __func__, ##__VA_ARGS__)
/**
 * @brief 打印完整DEBUG信息到终端，包括文件名，运行行数，函数名
 *
 */
#define PRINT_DEBUG_ALL(fmt, ...) fprintf(stderr, "\033[1m\033[38;5;208m[DEBUG]\033[0m %s:%d:%s(): " fmt "\n", __FILE__, __LINE__, __func__, ##__VA_ARGS__)
#else
#define PRINT_DEBUG_ALL(fmt, ...)
#define PRINT_DEBUG_ALL(fmt, ...)
#endif

/**
 * @brief 打印错误信息到终端，末尾自动加换行
 *
 */
#define PRINT_ERROR(msg) fprintf(stderr, "\033[1m\033[31m[ERROR]\033[0m %s: %s\n", msg, strerror(errno))

#endif /* __UTILS_H */